package math

import (
	"fmt"
	"math"
	"math/rand"
	"time"
)

func Show_Constant() {
	fmt.Printf("math.MaxFloat64: %f\n", math.MaxFloat64)
	fmt.Printf("math.SmallestNonzeroFloat64: %f\n", math.SmallestNonzeroFloat64)

	fmt.Printf("math.MaxFloat32: %f\n", math.MaxFloat32)
	fmt.Printf("math.SmallestNonzeroFloat32: %f\n", math.SmallestNonzeroFloat32)

	fmt.Printf("math.MaxInt8: %d\n", math.MaxInt8)
	fmt.Printf("math.MinInt8: %d\n", math.MinInt8)

	fmt.Printf("math.MaxUint8: %d\n", math.MaxUint8)

	fmt.Printf("math.MaxInt16: %d\n", math.MaxInt16)
	fmt.Printf("math.MinInt16: %d\n", math.MinInt16)

	fmt.Printf("math.MaxUint16: %d\n", math.MaxUint16)

	fmt.Printf("math.MaxInt32: %d\n", math.MaxInt32)
	fmt.Printf("math.MinInt32: %d\n", math.MinInt32)

	fmt.Printf("math.MaxUint32: %d\n", math.MaxUint32)

	fmt.Printf("math.MaxInt64: %d\n", math.MaxInt64)
	fmt.Printf("math.MinInt64: %d\n", math.MinInt64)

	// fmt.Printf("math.MaxUint64: %v\n", math.MaxUint64)
	fmt.Printf("math.Pi: %.10f\n", math.Pi)

}

func MathOp() {
	fmt.Printf("math.Abs(-3.14): %.2f\n", math.Abs(-3.14))

	fmt.Printf("math.Pow(2, 4): %.f\n", math.Pow(2, 4))

	fmt.Printf("math.Pow10(3): %.f\n", math.Pow10(3))

	// 开平方
	fmt.Printf("math.Sqrt(64): %.f\n", math.Sqrt(64))

	// 开立方
	fmt.Printf("math.Cbrt(27): %.f\n", math.Cbrt(27))

	// 向上取整
	fmt.Printf("math.Ceil(3.14): %.f\n", math.Ceil(3.14))

	// 向下取整
	fmt.Printf("math.Floor(8.75): %.f\n", math.Floor(8.75))

	fmt.Printf("math.Mod(10, 3): %.f\n", math.Mod(10, 3))

	intPart, decialPart := math.Modf(10 / 3)
	fmt.Printf("整数部分: %.f, 小数部分 %.14f \n", intPart, decialPart)

	intPart, decialPart = math.Modf(3.14159265358979)
	fmt.Printf("整数部分: %.f, 小数部分 %.14f \n", intPart, decialPart)
}

func init() {
	// 以时间作为初始种子
	rand.Seed(time.Now().UnixNano())
}

func Random() {
	for i := 0; i < 10; i++ {
		fmt.Println(rand.Int())
	}

	fmt.Println("--------------")
	for i := 0; i < 10; i++ {
		fmt.Println(rand.Intn(100))
	}
	fmt.Println("--------------")
	for i := 0; i < 10; i++ {
		fmt.Println(rand.Float32())
	}
}
